/**
 * 
 * @description 信安CA WebSocket 连接小精灵客户端 jsSDK
 * @author WuFeng <763476339@qq.com>
 * @param {Object} obj 构造配置
 *                  {
 *                    ip: ip地址host
 *                    isReconnect: true 断开不重连 、 false 断开重连
 *                  }
 * @param {Function} errorCallback 连接错误回调
 * @param {Function} closeCallback 连接关闭回调
 */

const WebSocketSDK = function (obj, errorCallback, closeCallback) {
  // export function WebSocketSDK (obj, errorCallback, closeCallback) {
  /*
  websocket接口地址
  1、http请求还是https请求 前缀不一样
  2、ip地址host
  3、端口号
  */

  // error callback
  let errorCallbackFun = errorCallback || null

  // close callback
  let closeCallbackFun = closeCallback || null

  const defaultObj = {
    ip: 'ws://localhost:9002/panda'
  }

  const config = obj ? Object.assign({}, defaultObj, obj) : defaultObj
  const protocol = (window.location.protocol == 'http:') ? 'ws://' : 'wss://';
  const host = window.location.host;
  const port = ':9005';
  // 接口地址url
  // console.log(config)
  this.url = config.ip || protocol + host + port;
  // socket对象
  this.socket;
  // 心跳状态  为false时不能执行操作 等待重连
  this.isHeartflag = false;
  // 重连状态  避免不间断的重连操作
  this.isReconnect = config.isReconnect || false;

  // 自定义Ws连接函数：服务器连接成功
  this.onopen = ((e) => {
    this.isHeartflag = true;
    console.log('---web socket连接成功---', e)
  })

  // 自定义Ws消息接收函数：服务器向前端推送消息时触发
  this.onmessage = ((e) => {
    console.log(`🚀 ~ WebSocketSDK ~ e:`, e)
    // const message = JSON.parse(e.data)
    const message = e? e.data : ''
    // 处理各种推送消息
    // console.log(message)
    // this.handleEvent(message)
  })

  // 自定义Ws异常事件：Ws报错后触发
  this.onerror = ((e) => {
    e
    console.log('ws error')
    setTimeout(function () {
      if (errorCallbackFun !== null) {
        errorCallbackFun()
      }
    }, 0)
    this.isHeartflag = false;
    this.reConnect();
  })

  // 自定义Ws关闭事件：Ws连接关闭后触发
  this.onclose = ((e) => {
    e
    setTimeout(function () {
      if (closeCallbackFun !== null) {
        closeCallbackFun()
      }
    }, 0)
    this.reConnect()
    console.log('ws close')
  })

  // 初始化websocket连接
  this.initWs()

}

// 初始化websocket连接 
WebSocketSDK.prototype.initWs = function () {
  window.WebSocket = window.WebSocket || window.MozWebSocket;
  if (!window.WebSocket) { // 检测浏览器支持  			
    console.error('错误: 浏览器不支持websocket');
    return;
  }
  var that = this;
  this.socket = new WebSocket(this.url); // 创建连接并注册响应函数  
  // 连接成功
  this.socket.onopen = function (e) {
    that.onopen(e);
  };
  // // 接收消息
  // this.socket.onmessage = function (e) {
  //   that.onmessage(e);
  // };
  // 连接关闭
  this.socket.onclose = function (e) {
    that.onclose(e);
    that.socket = null; // 清理  		
  };
  // 连接错误
  this.socket.onerror = function (e) {
    that.onerror(e);
  }
  return this;
}

WebSocketSDK.prototype.reConnect = function () {
  const _this = this
  if (this.isReconnect) {
    return;
  }
  this.isReconnect = true;
  // 没连接上会一直重连，设置延迟避免请求过多
  setTimeout(function () {
    _this.initWs()
    _this.isReconnect = false;
  }, 2000);
}

// 处理消息
WebSocketSDK.prototype.handleEvent = function (message) {
  // *************** 根据action定制处理
  const action = message.interface_type;
  // console.log('---------------')
  // console.log(this.handleAction[action])
  // 根据action处理事件
  if (this.handleAction[action]) {
    this.handleAction[action](message);
  } else {
    console.warn(`this.handleAction[${action}] not undefined`)
  }
}

// 事务处理 根据action
WebSocketSDK.prototype.handleAction = {
  // '1': function () {
  //   console.log(1)
  // },
  // '2': function () {
  //   console.log(2)
  // }
}

/**
 * @description 通用请求方法 -- 异步回调
 * @param {Object} params 入参
 * @param {Function} callback sockect服务返回数据后回调函数
 * @returns void
 */
WebSocketSDK.prototype.request = function (params, callback) {
  var that = this;
  //ws还没建立连接（发生错误）
  if (!this.isHeartflag) {
    console.log('连接中……')
    return;
  }
  // console.log('---typeof ')
  // console.log(typeof callback)
  if (typeof callback === 'function') {
    this.handleAction[params.interface_type] = callback
  } else {
    this.handleAction[params.interface_type] = null
  }
  // console.log(this.handleAction[params.interface_type])
  //组装json数据
  this.socket.send(JSON.stringify(params))
  console.log(JSON.stringify(params))
  // 接收消息
  this.socket.onmessage = function (e) {
    that.onmessage(e);
  };
}

// 同步接收服务返回的数据
WebSocketSDK.prototype._receiveMessage = function () {
  return new Promise((resolve) => {
    this.socket.onmessage = function (e) {
      // const message = JSON.parse(e.data)
      const message = e? e.data : ''
      resolve(message)
    }
  })
}

/**
 * @description 通用请求方法 -- 同步
 * @param {Object} params 入参
 * @param {Function} callback sockect服务返回数据后回调函数
 * @returns void
 */
WebSocketSDK.prototype.requestSync = async function (params, callback) {
  // return new Promise((resolve) => {
    
  // })
  //ws还没建立连接（发生错误）
  if (!this.isHeartflag) {
    console.log('连接中……')
    return;
  }
  //组装json数据
  this.socket.send(JSON.stringify(params))
  console.log('--- send message:', JSON.stringify(params))
  // // 接收消息
  // var result = await this._receiveMessage()
  // // console.log(result)
  
  // return result
}

export default WebSocketSDK